package com.monitor.ui.controller;

import com.monitor.MainFrame;
import com.monitor.security.PasswordManager;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.control.PasswordField;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage;

import java.io.IOException;

/**
 * 首页控制器，处理首页界面的交互逻辑
 */
public class DashBoardController {

    /**
     * 处理设置按钮点击事件
     */
    @FXML
    private void onSettingsClicked(MouseEvent event) {
        showPasswordDialog();
    }
    
    /**
     * 处理找回密码按钮点击事件
     */
    @FXML
    private void onForgotPasswordClicked(MouseEvent event) {
        showAlert(Alert.AlertType.INFORMATION, "提示", "找回密码功能待实现");
    }
    
    /**
     * 处理帮助信息按钮点击事件
     */
    @FXML
    private void onHelpClicked(MouseEvent event) {
        showAlert(Alert.AlertType.INFORMATION, "提示", "帮助信息功能待实现");
    }
    
    /**
     * 处理上网日志按钮点击事件
     */
    @FXML
    private void onLogClicked(MouseEvent event) {
        showAlert(Alert.AlertType.INFORMATION, "提示", "上网日志功能待实现");
    }
    
    /**
     * 处理问题反馈按钮点击事件
     */
    @FXML
    private void onFeedbackClicked(MouseEvent event) {
        showAlert(Alert.AlertType.INFORMATION, "提示", "问题反馈功能待实现");
    }

    /**
     * 处理防护中心按钮点击事件
     */
    @FXML
    private void onProtectionClicked(ActionEvent event) {
        navigateToMainFrame("protection");
    }

    /**
     * 处理控制中心按钮点击事件
     */
    @FXML
    private void onControlClicked(ActionEvent event) {
        navigateToMainFrame("control");
    }
    
    /**
     * 处理系统概览按钮点击事件
     */
    @FXML
    private void onHomeClicked(ActionEvent event) {
        navigateToMainFrame("home");
    }
    
    /**
     * 处理使用指南按钮点击事件
     */
    @FXML
    private void onGuideClicked(ActionEvent event) {
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/dialogs/GuideDialog.fxml"));
            Parent root = loader.load();
            
            Stage stage = new Stage();
            stage.setTitle("使用指南");
            stage.setScene(new Scene(root));
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.showAndWait();
        } catch (IOException e) {
            showAlert(Alert.AlertType.ERROR, "无法打开使用指南", "系统错误：" + e.getMessage());
        }
    }

    /**
     * 处理资源中心按钮点击事件
     */
    @FXML
    private void onResourceClicked(ActionEvent event) {
        navigateToMainFrame("resource");
    }

    /**
     * 处理维护中心按钮点击事件
     */
    @FXML
    private void onMaintenanceClicked(ActionEvent event) {
        navigateToMainFrame("maintenance");
    }

    /**
     * 显示密码验证对话框
     */
    private void showPasswordDialog() {
        try {
            // 创建密码管理器
            PasswordManager passwordManager = new PasswordManager();
            
            // 创建对话框
            Stage dialog = new Stage();
            dialog.initModality(Modality.APPLICATION_MODAL);
            dialog.setTitle("密码验证");
            dialog.setResizable(false);
            
            // 创建对话框内容
            VBox dialogContent = new VBox(10);
            dialogContent.getStyleClass().add("dialog-pane");
            dialogContent.setPadding(new javafx.geometry.Insets(20));
            
            javafx.scene.control.Label titleLabel = new javafx.scene.control.Label("请输入管理员密码");
            titleLabel.getStyleClass().add("dialog-title");
            
            PasswordField passwordField = new PasswordField();
            passwordField.setPromptText("输入密码");
            passwordField.setPrefWidth(250);
            
            javafx.scene.control.Label noteLabel = new javafx.scene.control.Label("注意：初始密码为112233，可在维护中心修改密码。");
            noteLabel.setWrapText(true);
            
            javafx.scene.layout.HBox buttonBox = new javafx.scene.layout.HBox(10);
            buttonBox.setAlignment(javafx.geometry.Pos.CENTER_RIGHT);
            
            javafx.scene.control.Button cancelButton = new javafx.scene.control.Button("取消");
            cancelButton.getStyleClass().add("secondary-button");
            cancelButton.setOnAction(e -> dialog.close());
            
            javafx.scene.control.Button okButton = new javafx.scene.control.Button("确定");
            okButton.getStyleClass().add("primary-button");
            okButton.setOnAction(e -> {
                String password = passwordField.getText();
                
                if (password.isEmpty()) {
                    showAlert(Alert.AlertType.ERROR, "错误", "请输入密码");
                    return;
                }
                
                if (passwordManager.verifyPassword(password)) {
                    // 密码正确，打开主界面
                    dialog.close();
                    openMainFrame();
                } else {
                    // 密码错误，显示错误信息
                    showAlert(Alert.AlertType.ERROR, "错误", "密码错误，请重试");
                }
            });
            
            buttonBox.getChildren().addAll(cancelButton, okButton);
            dialogContent.getChildren().addAll(titleLabel, passwordField, noteLabel, buttonBox);
            
            Scene dialogScene = new Scene(dialogContent);
            dialogScene.getStylesheets().add(getClass().getResource("/css/style.css").toExternalForm());
            
            dialog.setScene(dialogScene);
            dialog.showAndWait();
            
        } catch (Exception e) {
            e.printStackTrace();
            showAlert(Alert.AlertType.ERROR, "错误", "显示密码对话框失败: " + e.getMessage());
        }
    }

    /**
     * 打开主界面
     */
    private void openMainFrame() {
        try {
            // 加载JavaFX版本的MainFrame
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/MainFrame.fxml"));
            Parent root = loader.load();
            
            // 获取当前窗口
            Stage currentStage = (Stage) javafx.stage.Window.getWindows().stream()
                    .filter(javafx.stage.Window::isShowing)
                    .findFirst()
                    .orElse(null);
            
            if (currentStage != null) {
                // 在当前窗口显示MainFrame
                Scene scene = new Scene(root);
                scene.getStylesheets().add(getClass().getResource("/css/style.css").toExternalForm());
                currentStage.setScene(scene);
                currentStage.setTitle("金惠反黄专家 - 主控制台");
            }
            
        } catch (Exception e) {
            e.printStackTrace();
            showAlert(Alert.AlertType.ERROR, "错误", "打开主界面失败: " + e.getMessage());
        }
    }
    
    /**
     * 导航到主界面的特定部分
     */
    private void navigateToMainFrame(String section) {
        try {
            // 加载JavaFX版本的MainFrame
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/MainFrame.fxml"));
            Parent root = loader.load();
            
            // 获取控制器并设置选中的选项卡
            MainFrameController controller = loader.getController();
            controller.selectTab(section);
            
            // 获取当前窗口
            Stage currentStage = (Stage) javafx.stage.Window.getWindows().stream()
                    .filter(javafx.stage.Window::isShowing)
                    .findFirst()
                    .orElse(null);
            
            if (currentStage != null) {
                // 在当前窗口显示MainFrame
                Scene scene = new Scene(root);
                scene.getStylesheets().add(getClass().getResource("/css/style.css").toExternalForm());
                currentStage.setScene(scene);
                currentStage.setTitle("金惠反黄专家 - 主控制台");
            }
        } catch (Exception e) {
            e.printStackTrace();
            showAlert(Alert.AlertType.ERROR, "错误", "导航到" + section + "失败: " + e.getMessage());
        }
    }
    
    /**
     * 显示提示对话框
     */
    private void showAlert(Alert.AlertType alertType, String title, String message) {
        Alert alert = new Alert(alertType);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(message);
        alert.showAndWait();
    }
}